React์ experimental_Offscreen API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง์ ํ์ํ๊ณ UI ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค์ธ์. ํจ๊ณผ์ ์ธ ์ฌ์ฉ๋ฒ๊ณผ ์์ ๋ฅผ ์์๋ณด์ธ์.
์ฑ๋ฅ ์ ๊ธ ํด์ : React์ experimental_Offscreen API ์ฌ์ธต ๋ถ์
React๋ ํ๋ ์น ๊ฐ๋ฐ์ ์ด์์ผ๋ก์ ๊ฐ๋ฐ์๊ฐ ์ํธ ์์ฉ์ ์ด๊ณ ๋์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ต์ ์ ์ฑ๋ฅ์ ์ ์งํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํด์ง๋๋ค. React์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ํด๊ฒฐํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ ์ค ํ๋๋ experimental_Offscreen API์ ๋๋ค. ์ด API๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ UI ์๋ต์ฑ๊ณผ ์ธ์ง๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ experimental_Offscreen API, ์ด์ , ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
experimental_Offscreen API๋ ๋ฌด์์ ๋๊น?
React ์คํ์ ๊ธฐ๋ฅ์ผ๋ก ๋์ ๋ experimental_Offscreen API๋ ๊ธฐ๋ณธ ํ๋ฉด ๋ ๋๋ง ์ฃผ๊ธฐ ์ธ๋ถ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ์ค๋นํ ์ ์๋ ๋ฐฑ์คํ ์ด์ง ์์ญ์ด ์๋ค๊ณ ์๊ฐํ์ธ์. ์ด "์คํ์คํฌ๋ฆฐ" ๋ ๋๋ง์ ํตํด React๋ ์ฆ์ ํ์๋์ง ์์ ์ ์๋ UI ๋ถ๋ถ์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๊ฑฐ๋ ์บ์ํ์ฌ ๋ฉ์ธ ์ค๋ ๋์ ๋ถํ๋ฅผ ์ค์ด๊ณ ๋ ๋ถ๋๋ฝ๊ณ ์๋ต์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. "์คํ์ " ์ง์ ์ API๊ฐ ํฅํ React ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
experimental_Offscreen ์ฌ์ฉ์ ์ด์
- ํฅ์๋ UI ์๋ต์ฑ: ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ์ฌ ํ๋ฉด์ ํ์ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํฌ๊ฒ ์ค์ ๋๋ค. ์ด๋ ๋ณต์กํ ์ปดํฌ๋ํธ ๋๋ ๊ณผ๋ํ ๊ณ์ฐ์ด ํ์ํ UI ์น์ ์ ํนํ ์ ์ฉํฉ๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ ๋ถ๋๋ฝ๊ณ ์๋ต์ฑ์ด ๋ฐ์ด๋ UI๋ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค. ์ฌ์ฉ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๊ณ ์ ์ฐํ๊ฒ ๋๊ปด์ ธ ์ฐธ์ฌ๋์ ๋ง์กฑ๋๊ฐ ๋์์ง๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋น ์น์ ์ผ๋ก ์ด๋ํ ๋ ์ฆ์ ํ์๋ ์ ์๋๋ก ๋ณต์กํ ๋ฐ์ดํฐ ์๊ฐํ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ก๋๋๋ค๊ณ ์์ํด ๋ณด์ธ์.
- ๋ฉ์ธ ์ค๋ ๋ ์ฐจ๋จ ๊ฐ์: ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ๋ฉ์ธ ์ค๋ ๋์์ ๋ ๋๋ง ์์ ์ ์คํ๋ก๋ํ์ฌ ์ฅ๊ธฐ ์คํ ์์ ์ผ๋ก ์ธํด ์ฐจ๋จ๋์ง ์๋๋ก ํฉ๋๋ค. ์ด๋ UI ์๋ต์ฑ์ ์ ์งํ๊ณ ๋์ฐํ "๋๊น" ํ์์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ํจ์จ์ ์ธ ๋ฆฌ์์ค ํ์ฉ: ๋ฏธ๋ฆฌ ๋ ๋๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ์บ์ฑํ์ฌ API๋ ํ์ํ ์ฌ๋ ๋๋ง ์์ ์ค์ฌ ๋ ํจ์จ์ ์ธ ๋ฆฌ์์ค ํ์ฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์ ํ๋ ๋ชจ๋ฐ์ผ ์ฅ์น์ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๊ฐ์ํ๋ ์ํ ๊ด๋ฆฌ: ๊ฒฝ์ฐ์ ๋ฐ๋ผ Offscreen์ ํ์ฌ ํ์๋์ง ์๋๋ผ๋ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์ ์งํ ์ ์๋๋ก ํ์ฌ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ ํผ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๊ฑฐ๋ ๋ชฉ๋ก์ ์คํฌ๋กค ์์น๋ฅผ ์ ์งํ๋ ๊ฒ๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์ ์ ์ฉํ ์ ์์ต๋๋ค.
experimental_Offscreen ์ฌ์ฉ ์ฌ๋ก
experimental_Offscreen API๋ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์ ํนํ ์ ํฉํฉ๋๋ค.
1. ํญ ๋๋ ์น์ ๋ฏธ๋ฆฌ ๋ ๋๋ง
ํญ ์ธํฐํ์ด์ค ๋๋ ๋ค์ค ์น์ ๋ ์ด์์์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ Offscreen์ ์ฌ์ฉํ์ฌ ํ์ฌ ํ์๋์ง ์์ ํญ ๋๋ ์น์ ์ ์ฝํ ์ธ ๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํญ์ผ๋ก ์ ํํ๋ฉด ์ฝํ ์ธ ๊ฐ ์ด๋ฏธ ๋ ๋๋ง๋์ด ์ฆ์ ํ์ํ ์ ์์ต๋๋ค.
์: ํญ์ ํ์๋ ์ ํ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์๋ ์ ์ ์๊ฑฐ๋ ์น์ฌ์ดํธ๋ฅผ ์๊ฐํด ๋ณด์ธ์. Offscreen์ ์ฌ์ฉํ๋ฉด ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ ํ ๋ชฉ๋ก์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์นดํ ๊ณ ๋ฆฌ ํญ์ ํด๋ฆญํ๋ฉด ํด๋น ์ ํ ๋ชฉ๋ก์ด ๋์ ๋๋ ๋ก๋ฉ ์๊ฐ ์์ด ์ฆ์ ํ์๋ฉ๋๋ค. ์ด๋ ๋ง์ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ด ๊ฒฝ๋ก ์ ํ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ์ง๋ง ๋ ๋ฎ์ ์์ค์ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
2. ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์ปดํฌ๋ํธ ์บ์ฑ
๋๋์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ฑฐ๋ ๋ณต์กํ ๊ณ์ฐ์ ์ํํ๋ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ Offscreen์ ์ฌ์ฉํ์ฌ ๋ ๋๋ง๋ ์ถ๋ ฅ์ ์บ์ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ค์ ํ์๋ ๋ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๊ฑฐ๋ ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์: ๋ณต์กํ ์ฐจํธ์ ์ค์๊ฐ ์ฃผ์ ์์ฅ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๊ธ์ต ๋์๋ณด๋๋ฅผ ์์ํด ๋ณด์ธ์. Offscreen์ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง๋ ์ฐจํธ๋ฅผ ํน์ ๊ธฐ๊ฐ ๋์ ์บ์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋์๋ณด๋๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๋ฉด ์บ์๋ ์ฐจํธ๊ฐ ์ฆ์ ํ์๋๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์บ์ฑํ ์ ๋ฒ์ ์ ์ค๋นํฉ๋๋ค. ์ด๋ฌํ ์ ํ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฐ์ดํธ๋ ๋น ๋ฅธ ๋ ๋๋ง ์๋๊ฐ ํ์ํ์ง๋ง ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
3. ํ๋ฉด ์ธ๋ถ ์ฝํ ์ธ ์ ์ง์ฐ ๋ ๋๋ง
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ด๊ธฐ์๋ ํ๋ฉด ์ธ๋ถ์ ์๋ ์ปดํฌ๋ํธ(์: ํ์ด์ง ์๋์ชฝ)๊ฐ ์๊ณ ์ฆ์ ๋ ๋๋งํ ํ์๊ฐ ์์ ์ ์์ต๋๋ค. Offscreen์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ๊ฑฐ์ ํ์๋ ๋๊น์ง ์ง์ฐ์์ผ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์: ์๋ง์ ์ด๋ฏธ์ง์ ์๋ฒ ๋๋ ๋น๋์ค๊ฐ ์๋ ๊ธด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์๊ฐํด ๋ณด์ธ์. Offscreen์ ์ฌ์ฉํ๋ฉด ํ์ด์ง ์๋์ชฝ์ ์๋ ์ด๋ฏธ์ง์ ๋น๋์ค์ ๋ ๋๋ง์ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์๋๋ก ์คํฌ๋กคํ๋ฉด ๊ตฌ์ฑ ์์๊ฐ ๋ณด๊ธฐ ์ง์ ์ ๋ ๋๋ง๋์ด ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์คํฌ๋กค ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
4. ์ ํ์ ์ํ ์ปดํฌ๋ํธ ์ค๋น
Offscreen์ ์ฌ์ฉํ์ฌ ์ ๋๋ฉ์ด์ ์ ํ์ ์ํด ์ปดํฌ๋ํธ๋ฅผ ์ค๋นํ ์ ์์ต๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปดํฌ๋ํธ์ ๋์ ์ํ๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ์ฌ ์ ๋๋ฉ์ด์ ์ด ํธ๋ฆฌ๊ฑฐ๋ ๋ ๋ถ๋๋ฝ๊ณ ์ํํ ์ ํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
์: ์ฌ๋ผ์ด๋ ์ธ ๋ฉ๋ด๊ฐ ์๋ ๋ชจ๋ฐ์ผ ์ฑ์ ์๊ฐํด ๋ณด์ธ์. Offscreen์ ์ฌ์ฉํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฉ๋ด ์ฝํ ์ธ ๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ค์์ดํํ์ฌ ๋ฉ๋ด๋ฅผ ์ด๋ฉด ๋ฏธ๋ฆฌ ๋ ๋๋ง๋ ์ฝํ ์ธ ๊ฐ ์ด๋ฏธ ์ค๋น๋์ด ์์ด ๋ถ๋๋ฝ๊ณ ์ ์ฐํ ์ฌ๋ผ์ด๋ฉ ์ ๋๋ฉ์ด์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
experimental_Offscreen API ์ฌ์ฉ ๋ฐฉ๋ฒ
experimental_Offscreen API๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์คํ์คํฌ๋ฆฐ์์ ๋ ๋๋งํ๋ ค๋ ์ปดํฌ๋ํธ๋ฅผ <Offscreen> ์ปดํฌ๋ํธ๋ก ๋ํํด์ผ ํฉ๋๋ค. <Offscreen> ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๋ฅผ ์คํ์คํฌ๋ฆฐ์์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ mode prop์ ํ์ฉํฉ๋๋ค.
๊ธฐ๋ณธ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import { unstable_Offscreen as Offscreen } from 'react';
function MyComponent() {
return (
{/* Content to be rendered */}
My Content
);
}
mode prop์ ๋ค์ ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- "visible" (๊ธฐ๋ณธ๊ฐ): ์ปดํฌ๋ํธ๊ฐ ํ์์ ๊ฐ์ด ๋ ๋๋ง๋๊ณ ํ๋ฉด์ ํ์๋ฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ์คํฌ๋ฆฐ ๊ธฐ๋ฅ์ ๋นํ์ฑํํฉ๋๋ค.
- "hidden": ์ปดํฌ๋ํธ๊ฐ ์คํ์คํฌ๋ฆฐ์์ ๋ ๋๋ง๋๊ณ ํ๋ฉด์ ํ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ํ๋ฅผ ์ ์งํ๊ณ ํ์ํ ๋ ๋น ๋ฅด๊ฒ ํ์ํ ์ ์์ต๋๋ค.
- "unstable-defer": ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ์ผ๋ฐ์ ์ผ๋ก ํ์๋ ๋๊น์ง ๋์ค ์๊ฐ๊น์ง ์ง์ฐ๋ฉ๋๋ค. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ต์ ํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ React.lazy()์ ์ ์ฌํ์ง๋ง ์ด๋ฏธ ๋ก๋๋ ์ฝ๋์ ์ ์ฉ๋ฉ๋๋ค.
์์ : ํญ ๋ฏธ๋ฆฌ ๋ ๋๋ง
Offscreen์ ์ฌ์ฉํ์ฌ ํญ์ ์ฝํ ์ธ ๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import { unstable_Offscreen as Offscreen, useState } from 'react';
function TabContent({ content }) {
return (
{content}
);
}
function MyTabs() {
const [activeTab, setActiveTab] = useState('tab1');
return (
);
}
์ด ์์ ์์๋ ๋ ํญ์ ์ฝํ ์ธ ๊ฐ ์ฒ์์ ๋ ๋๋ง๋์ง๋ง ํ์ฑ ํญ์ ์ฝํ ์ธ ๋ง ํ์๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํญ์ผ๋ก ์ ํํ๋ฉด ์ฝํ ์ธ ๊ฐ ์ด๋ฏธ ๋ ๋๋ง๋์ด ์ฆ์ ํ์ํ ์ ์์ต๋๋ค.
์์ : ํ๋ฉด ์ธ๋ถ ์ฝํ ์ธ ์ ๋ ๋๋ง ์ง์ฐ
Offscreen์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ์๋ ํ๋ฉด ์ธ๋ถ์ ์๋ ์ฝํ ์ธ ์ ๋ ๋๋ง์ ์ง์ฐํ๋ ๋ฐฉ๋ฒ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import { unstable_Offscreen as Offscreen } from 'react';
function MyComponent() {
return (
Some initial content
Content that will be rendered later
);
}
์ด ์์ ์์ <Offscreen> ์ปดํฌ๋ํธ ๋ด์ ์ฝํ
์ธ ๋ ์ด๊ธฐ ์ฝํ
์ธ ๊ฐ ๋ ๋๋ง๋ ํ์ ๋ ๋๋ง๋์ด ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค.
experimental_Offscreen ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
experimental_Offscreen API๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์.
- ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋ง: Offscreen์ ๊ตฌํํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ผ์ผํค๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ณํ์ธ์. React DevTools ๋๋ ๊ธฐํ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง์ด ๋๋ฆฌ๊ฑฐ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ์์ญ์ ์ ํํ ์ฐพ์๋ด์ธ์.
- Offscreen์ ์๊ปด์ ์ฌ์ฉํ์ธ์: ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ Offscreen์ผ๋ก ๋ฌด์ฐจ๋ณ์ ์ผ๋ก ๋ํํ์ง ๋ง์ธ์. ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์ปดํฌ๋ํธ, ์ด๊ธฐ์๋ ํ๋ฉด ์ธ๋ถ์ ์๋ ์ปดํฌ๋ํธ ๋๋ ์ ํ์ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์ ๊ฐ์ด ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ์ด์ ์ ๊ฐ์ฅ ๋ง์ด ๋๋ฆด ์ ์๋ ์ปดํฌ๋ํธ์ ์ง์คํ์ธ์.
- ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋ ๊ณ ๋ ค: ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ๋ฏธ๋ฆฌ ๋ ๋๋ง๋ ์ปดํฌ๋ํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋๋ฆด ์ ์์ต๋๋ค. ํนํ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ๋ชจ๋ฐ์ผ ์ฅ์น์์๋ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ์ผ๋์ ๋์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ๊ณ Offscreen ์ ๋ต์ ์ ์ ํ ์กฐ์ ํ์ธ์.
- ์ฒ ์ ํ ํ ์คํธ: experimental_Offscreen API๋ ์ฌ์ ํ ์คํ์ ์ด๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฒ ์ ํ ํ ์คํธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค๋ฅธ ์ฅ์น์ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธํ๊ณ ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ธ์.
- ์ ์ฌ์ ์ธ ๋ถ์์ฉ ์ธ์: ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ํนํ ์ ์ญ ์ํ ๋๋ ์ธ๋ถ ๋ฆฌ์์ค์ ์์กดํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ฏธ๋ฌํ ๋ถ์์ฉ์ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ์ฌ์ ์ธ ๋ถ์์ฉ์ ์ผ๋์ ๋๊ณ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์คํ๊ฒ ํ ์คํธํ์ธ์. ์๋ฅผ ๋ค์ด ์ฐฝ ํฌ๊ธฐ์ ์์กดํ๋ ์ปดํฌ๋ํธ๋ ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง ์ ์ฐฝ์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋์ง ์์ ์ ์์ต๋๋ค.
- ๊ตฌํ ํ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: Offscreen์ ๊ตฌํํ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ์ค์ ๋ก ํฅ์๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ธ์. ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ๋ก๋ ์๊ฐ, ๋ ๋๋ง ์๊ฐ ๋ฐ ํ๋ ์ ์๋์ ๊ฐ์ ๋ฉํธ๋ฆญ์ ์ถ์ ํ์ธ์.
- ๋์ ๊ณ ๋ ค: Offscreen์ ์์กดํ๊ธฐ ์ ์ ์ฝ๋ ๋ถํ , ๋ฉ๋ชจ์ด์ ์ด์ ๋ฐ ๊ฐ์ํ์ ๊ฐ์ ๋ค๋ฅธ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ์ ์ ํ์ํ์ธ์. Offscreen์ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ๋ง๋ณํต์น์ฝ์ ์๋๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ ๊ฐ๋จํ ์ต์ ํ ๊ธฐ์ ๋ก ๋ณต์ก์ฑ์ ์ค์ด๋ฉด์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ์ฃผ์ ์ฌํญ
- ์คํ์ ์ํ: ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด experimental_Offscreen API๋ ์ฌ์ ํ ์คํ์ ๋จ๊ณ์ ์์ต๋๋ค. ์ฆ, ํฅํ React ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค. API๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ฝ๋๋ฅผ ์กฐ์ ํ ์ค๋น๋ฅผ ํ์ธ์.
- ๋ธ๋ผ์ฐ์ ์ง์: React ์์ฒด๋ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํธํ๋์ง๋ง Offscreen์ด ํ์ฉํ๋ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ง์ ์์ค์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋์ ๋ธ๋ผ์ฐ์ ์์ ์ฒ ์ ํ ํ ์คํธํ์ธ์.
- ์ ๊ทผ์ฑ: Offscreen ์ฌ์ฉ์ด ์ ๊ทผ์ฑ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ์ธ์. ์๋ฅผ ๋ค์ด ์ด๊ธฐ์๋ ํ๋ฉด ์ธ๋ถ์ ์๋ ์ฝํ ์ธ ์ ๋ ๋๋ง์ ์ง์ฐํ๋ ๊ฒฝ์ฐ ์ฝํ ์ธ ๊ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋ ๋ฐ ๊ธฐํ ๋ณด์กฐ ๊ธฐ์ ์์ ์ฌ์ ํ ์ ๊ทผํ ์ ์๋์ง ํ์ธํ์ธ์.
Suspense ๋ฐ ์ง์ฐ ๋ก๋ฉ๊ณผ ํตํฉ
experimental_Offscreen API๋ React์ Suspense ๋ฐ ์ง์ฐ ๋ก๋ฉ ๊ธฐ๋ฅ๊ณผ ํจ๊ณผ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ๋์ฑ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
Suspense
Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋๋ ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์
์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ฝ๋๋ฅผ ๋ก๋ํ๋ ์ปดํฌ๋ํธ๋ฅผ <Suspense> ์ปดํฌ๋ํธ๋ก ๋ํํ๊ณ ๋ฐ์ดํฐ ๋๋ ์ฝ๋๊ฐ ๋ก๋๋๋ ๋์ ํ์ํ ๋์ฒด UI๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
import { unstable_Offscreen as Offscreen, Suspense } from 'react';
function MyComponent() {
return (
Loading...}>
{/* Component that fetches data */}
<DataFetchingComponent />
);
}
์ด ์์ ์์ <DataFetchingComponent />๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ์คํ์คํฌ๋ฆฐ์์ ๋ ๋๋ง๋ฉ๋๋ค. <Suspense> ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๊น์ง "Loading..." ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ธ์ค๋ฉด <DataFetchingComponent />๊ฐ ์ฆ์ ํ์๋ฉ๋๋ค.
์ง์ฐ ๋ก๋ฉ
์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๋ฉด ํ์ํ ๋๋ง ์ปดํฌ๋ํธ ๋๋ ๋ชจ๋์ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ค์ด๋ก๋ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
import { unstable_Offscreen as Offscreen, lazy, Suspense } from 'react';
const MyLazyComponent = lazy(() => import('./MyLazyComponent'));
function MyComponent() {
return (
Loading...}>
<MyLazyComponent />
);
}
์ด ์์ ์์ <MyLazyComponent />๋ ๋ ๋๋ง๋ ๋ ์ง์ฐ ๋ก๋๋ฉ๋๋ค. <Suspense> ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋ ๋๊น์ง "Loading..." ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ฉด ์ฆ์ ํ์๋ฉ๋๋ค.
React์ ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ๋ฏธ๋
experimental_Offscreen API๋ React์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ์์ ์ค์ํ ์ง์ ์ ๋ํ๋ ๋๋ค. React๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ Offscreen API๋ ๋์ฑ ์์ ์ ์ด๊ณ ๋๋ฆฌ ์ฑํ๋๋ ๊ธฐ๋ฅ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋์ ๋ ๋๋ง ๋ฐ ๊ธฐํ ์ฑ๋ฅ ๊ด๋ จ ๊ธฐ๋ฅ์ ์ง์์ ์ธ ๊ฐ๋ฐ์ ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ์ด์ ์ ๋์ฑ ํฅ์์ํฌ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
experimental_Offscreen API๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง์ ํ์ฑํํ๋ฉด UI ์๋ต์ฑ์ ํฌ๊ฒ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ฉฐ ๋ฉ์ธ ์ค๋ ๋ ์ฐจ๋จ์ ์ค์ผ ์ ์์ต๋๋ค. ์ฌ์ ํ ์คํ์ ๋จ๊ณ์ ์์ง๋ง API๋ React ์ฑ๋ฅ ์ต์ ํ์ ๋ฏธ๋๋ฅผ ์ฟ๋ณผ ์ ์๊ฒ ํด์ค๋๋ค. ์ด์ , ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ experimental_Offscreen API๋ฅผ ํ์ฉํ์ฌ ๋ ๋น ๋ฅด๊ณ ๋ถ๋๋ฝ๊ณ ๋งค๋ ฅ์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. API์ ์คํ์ ํน์ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ํ๋ก๋์ ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ฒ ์ ํ ํ ์คํธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์ด ๊ฐ์ด๋๋ experimental_Offscreen API๋ฅผ ์ดํดํ๊ณ ๊ตฌํํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ ์์ธํ ์ดํด๋ณด๋ฉด์ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ๊ตฌ์ฑ์ ์คํํ์ฌ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ ์ฌํญ์ ๋ง๋ ์ต์ ์ ์ ๊ทผ ๋ฐฉ์์ ์ฐพ์ผ์ธ์. ์น ๊ฐ๋ฐ์ ์ธ๊ณ๋ ๋์์์ด ์งํํ๊ณ ์์ผ๋ฉฐ ์ต์ ๋๊ตฌ์ ๊ธฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค.